<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>08_Promise-Promise的catch返回值</title>
  <!-- 
  在 JavaScript 中， `Promise`  的  `catch`  方法用于处理  `Promise`  被拒绝（rejected）的情况。它也具有返回值的特性。
  1.  `catch`  的基本返回值
  -  `catch`  方法总是返回一个新的  `Promise`  对象。
  - 这个返回的  `Promise`  对象的状态取决于  `catch`  中的回调函数的执行结果。

  2. 返回值的类型
  - 如果  `onRejected`  返回一个值：新的  `Promise`  将被解决（fulfilled），并且解决的值是  `onRejected`  返回的值。
  const promise1 = Promise.reject("Initial error");

  promise1
      .catch((error) => {
          console.error(error); // 输出: Initial error
          return "Recovered value"; // 返回一个值
      })
      .then((value) => {
          console.log(value); // 输出: Recovered value
      });
  - 如果  `onRejected`  返回一个  `Promise` ：新的  `Promise`  将会等待这个  `Promise`  的解决结果，并将其作为解决值。
  const promise2 = Promise.reject("Another error");

  promise2
      .catch((error) => {
          console.error(error); // 输出: Another error
          return new Promise((resolve) => {
              setTimeout(() => resolve("Resolved after recovery"), 1000);
          });
      })
      .then((value) => {
          console.log(value); // 输出: Resolved after recovery
      });
  - 如果  `onRejected`  抛出错误：新的  `Promise`  将被拒绝（rejected），并且拒绝的原因是抛出的错误。
  const promise3 = Promise.reject("Error occurred");

  promise3
      .catch((error) => {
          console.error(error); // 输出: Error occurred
          throw new Error("New error after recovery"); // 抛出新的错误
      })
      .catch((error) => {
          console.error(error.message); // 输出: New error after recovery
      });
  3. 链式调用
  由于  `catch`  返回一个新的  `Promise` ，可以实现链式调用，并且每个  `catch`  可以有自己的处理逻辑。
  const promise4 = Promise.reject("Initial rejection");

  promise4
      .catch((error) => {
          console.error(error); // 输出: Initial rejection
          return "Handling rejection"; // 返回一个值
      })
      .then((value) => {
          console.log(value); // 输出: Handling rejection
          throw new Error("Error in then"); // 抛出错误
      })
      .catch((error) => {
          console.error(error.message); // 输出: Error in then
      });
  4. 总结
  `Promise`  的  `catch`  方法的返回值特性使得错误处理更加灵活和强大。通过返回值，可以在多个  `catch`  之间传递数据、处理错误，并实现复杂的异步操作。理解  `catch`  返回值的行为对于有效地使用  `Promise`  进行错误处理和异步编程至关重要。
  -->
</head>
<body>

  <script>
    // 1. catch返回值
    // const p = new Promise((resolve, reject) => {
    //   reject('error')
    // })

    // p.catch((err) => {
    //   console.log(err)
    //   return 'catch'
    // }).then((res) => {
    //   console.log(res) // catch
    // })

    // 2. catch返回值是Promise
    // const p2 = new Promise((resolve, reject) => {
    //   reject('error')
    // })

    // p2.catch((err) => {
    //   console.log(err)
    //   return new Promise((resolve, reject) => {
    //     resolve('catch')
    //   })
    // }).then((res) => {
    //   console.log(res) // catch
    // })

    // 3.catch方法的执行时机
    const p3 = new Promise((resolve, reject) => {
      resolve('success')
    })

    p3.then(res => {
      console.log("then第一次回调:", res)
      return "bbbbbb"
    }).then((res) => {
      console.log("then第二次回调:", res)
      throw new Error('的异常error')
    }).then(res => {
      console.log("then第三次回调:", res);
    }).catch((err) => {
      console.log(err) // error
    })
    
  </script>
  
</body>
</html>